// 

const http = require('http'); // 导入 http 模块
const path = require('path'); // 导入 path 模块
const fs = require('fs'); // 导入 file system 模块
const qs = require('querystring'); // 导入 querystring 模块

const mime = require('mime'); // 导入第三方模块 mime

const ecutUrl = require('./url-ecut'); // 导入自定义模块

const port = 8080;
const charset = 'utf8';

const server = http.createServer();

// 为了方便使用，这里声明了一个 Student对象
function Student(name, gender) {
    this.name = name;
    this.gender = gender;
}

let students = []; // 声明一个用来存放学生实例的数组

server.on('request', (req, resp) => {
    let ext = path.extname(req.url);
    console.log(req.method, req.url, ext);

    if (ext) { // 暂且将有扩展名视为文件和其它请求路径的区别
        let pathname = path.join(__dirname, req.url);
        let mimeType = mime.getType(pathname);
        fs.readFile(pathname, charset, (error, content) => {
            console.log('读取', pathname);
            if (error) {
                console.log('出错了', error.message);
                resp.writeHead(200, { 'content-type': mimeType });
                resp.end('你访问的文件不存在');
            } else {
                resp.end(content);
            }
        });
    } else { // 如果请求路径不是对应文件
        let x = ecutUrl.parse(req.url);
        // 专门负责接受表单数据并将接受到的参数封装到一个Student实例中
        if (req.method === 'POST' && x.path === '/add') {
            let chunk = []; // 声明一个数组用来保存缓冲区
            req.on('data', (buf) => {
                chunk.push(buf); // 将缓冲区依次添加到chunk数组中
            });
            req.on('end', () => {
                let buffer = Buffer.concat(chunk); // 将数组中所有缓冲区连接成一个大缓冲区
                let str = buffer.toString(); // 将缓冲区解码为字符串
                let params = qs.decode(str); // 使用 querystring 模块提供的支持解析 字符串为 Objet实例
                console.log(params);

                let stu = new Student(params.name, params.gender);
                students.push(stu);
            });
            // 重定向到 /list
            resp.writeHead(302, { 'location': '/list' });
        }

        if (req.method === 'GET' && x.path === '/list') {

            resp.writeHead(200, { 'content-type': 'text/html;charset=UTF-8' })

            let content = '<table>';

            if (students.length == 0) {
                content += '<tr><td>暂无数据</td></tr>';
            } else {
                students.forEach(stu => {
                    content += `<tr>
                                    <td>${stu.name}</td>
                                    <td>${stu.gender}</td>
                                    <td><a href="/remove?name=${stu.name}">删除</a></td>
                                </tr>`;
                });
            }

            content += '</table>';

            content += '<a href="/add.html">继续添加</a>';

            resp.write(content);
        }

        if (req.method === 'GET' && x.path === '/remove') {
            let str = x.query;
            console.log(str);
            let params = qs.decode(str);
            console.log(params);

            let index = -1;
            for (let i = 0; i < students.length; i++) {
                // 通过对比姓名来确定被删除的元素索引
                if (students[i].name === params.name) {
                    index = i;
                    break;
                }
            }

            if (index != -1) {
                students.splice(index, 1);
            }

            // 重定向到 /list
            resp.writeHead(302, { 'location': '/list' });
        }

        if (req.method === 'GET' && x.path === '/') {
            // 重定向到 /list
            resp.writeHead(302, { 'location': '/index.html' });
        }
        resp.end();
    }

});

server.listen(port);